﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FastFood.Business.Entities;
using FastFood.Business.Logic;
using FastFood.Business.Entities.Tipos;

namespace FastFood.Windows.Controles
{
    public partial class PermisosFormulario : UserControl
    {        
        public PermisosFormulario()
        {
            InitializeComponent();
        }
        
        MenuCn menuCn;
        FormularioCn formularioCn;
        private short persnoaID;
        public short PersonaID
        {
            get { return this.persnoaID; }
            set
            {
                this.persnoaID = value;
                Permisos.Clear();
                PermisosFormulario_Load(this, EventArgs.Empty);
            }
        }
        private List<Permisos> permisos = null;
        public List<Permisos> Permisos
        {
            get
            {
                if (this.permisos == null)
                {
                    this.permisos = new List<Permisos>();
                }
                return this.permisos;
            }
            set
            {
                this.permisos = value;
            }
        }

        public bool EnabledPermisos
        {
            get { return this.dgvPermisos.Enabled; }
            set
            {
                this.chkTodos.Enabled = value;
                this.dgvPermisos.Enabled = value;
            }
        }

        private void PermisosFormulario_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                try
                {
                    MenuCn menuCn = new MenuCn();
                    this.menuBindingSource.DataSource = menuCn.ObtenerMenusPorContenedor(null);
                    cmbMenus_SelectedIndexChanged(sender, EventArgs.Empty);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void cmbMenus_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                byte menuID = Convert.ToByte(this.cmbMenus.SelectedValue);
                //FormularioCn formularioCn = new FormularioCn();
                //MenuCn menuCn = new MenuCn();
                //List<FastFood.Entidad.Menu> menus = menuCn.ObtenerMenusPorContenedor(menuID);
                List<Formularios> formularios = new List<Formularios>();
                menuCn = new MenuCn();
                formularioCn = new FormularioCn();
                CargarFormularios(menuID, formularios);
                //formularios.AddRange(formularioCn.ObtenerFormulariosPorMenuID(menuID));

                //if (menus != null)
                //{
                //    foreach (FastFood.Entidad.Menu menu in menus)
                //    {
                //        formularios.AddRange(formularioCn.ObtenerFormulariosPorMenuID(menu.MenuID));
                //    }
                //}
                //LoadPermisos(menuID);
                this.formularioBindingSource.DataSource = formularios;
                dgvFormularios_CellEnter(sender, new DataGridViewCellEventArgs(0, this.formularioBindingSource.Position));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarFormularios(byte idMenu, List<Formularios> lista)
        {
            List<Menus> menus = menuCn.ObtenerMenusPorContenedor(idMenu);
            FormularioCn formularioCn = new FormularioCn();
            lista.AddRange(formularioCn.ObtenerFormulariosPorMenuID(idMenu));
            foreach (Menus menu in menus)
            {
                CargarFormularios(menu.menuID, lista);
            }
            
        }

        private void dgvFormularios_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                try
                {
                    LoadPermisosOfFormulario(Convert.ToByte(formularioKryptonDataGridView.CurrentRow.Cells[0].Value));
                    this.chkTodos.CheckedChanged -= chkTodos_CheckedChanged;
                    this.chkTodos.Checked = false;
                    this.chkTodos.CheckedChanged += chkTodos_CheckedChanged;
                    List<Permisos> temp = null;
                    ClearPermisos();

                    Formularios formulario = this.formularioBindingSource.Current as Formularios;
                    PersonalCn personalCn = new PersonalCn();
                    UsuarioCn usuarioCn = new UsuarioCn();
                    temp = usuarioCn.ObtenerPermisosPorUsuarioAndFormulario(PersonaID, formulario.formularioID);
                    if (temp != null)
                    {
                        foreach (Permisos permiso in temp)
                        {
                            foreach (DataGridViewRow fila in this.dgvPermisos.Rows)
                            {
                                if (Convert.ToByte(fila.Cells[0].Value) == permiso.tipoPermiso) fila.Cells[2].Value = permiso.estado;
                            }
                        }
                    }

                    //temp = Permisos.FindAll(p => p.formularioID.Equals(formulario.formularioID));
                    //if (temp != null)
                    //{
                    //    foreach (Permisos permiso in temp)
                    //    {
                    //        this.dgvPermisos.Rows[(int)permiso.tipoPermiso].Cells[2].Value = permiso.estado;
                    //    }
                    //}
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void dgvPermisos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 2 && e.RowIndex != -1)
            {
                bool valor = Convert.ToBoolean(this.dgvPermisos.Rows[e.RowIndex].Cells[2].Value);
                this.dgvPermisos.Rows[e.RowIndex].Cells[2].Value = !valor;

                if (e.RowIndex == 0 && !valor == false)
                {
                    for (int i = 0; i < this.dgvPermisos.Rows.Count; i++)
                    {
                        this.dgvPermisos.Rows[i].Cells[2].Value = false;
                        SetPermiso(i);
                    }
                }
                else
                {
                    this.dgvPermisos.Rows[0].Cells[2].Value = true;
                    SetPermiso(0);
                    SetPermiso(e.RowIndex);
                }
            }
        }

        private void chkTodos_CheckedChanged(object sender, EventArgs e)
        {
            for (int i = 0; i < this.dgvPermisos.Rows.Count; i++)
            {
                this.dgvPermisos.Rows[i].Cells[2].Value = this.chkTodos.Checked;
                SetPermiso(i);
            }
        }

        private void SetPermiso(int index)
        {
            byte formularioID = (this.formularioBindingSource.Current as Formularios).formularioID;
            byte tipoPermiso = Convert.ToByte(this.dgvPermisos.Rows[index].Cells[0].Value);
            bool valor = Convert.ToBoolean(this.dgvPermisos.Rows[index].Cells[2].Value);

            List<Permisos> temp = Permisos.FindAll(p => p.formularioID.Equals(formularioID));
            foreach (Permisos permiso in temp)
            {
                if (tipoPermiso == permiso.tipoPermiso)
                {
                    permiso.estado = valor;
                    return;
                }
            }
            Permisos.Add(
                new Permisos
                {
                    estado = valor,
                    tipoPermiso = tipoPermiso,
                    formularioID = formularioID,
                    usuarioID = PersonaID
                });
        }

        public void ClearPermisos()
        {
            for (int i = 0; i < this.dgvPermisos.Rows.Count; i++)
            {
                this.dgvPermisos.Rows[i].Cells[2].Value = false;
            }
        }

        public void LoadPermisos(int menuID)
        {
            this.dgvPermisos.Rows.Clear();

            if (menuID != 2 && menuID != 3) // Diferente de Procesos y Reportes
            {
                this.dgvPermisos.Rows.Add(4);
                for (int i = 0; i < 4; i++)
                {
                    this.dgvPermisos.Rows[i].Cells[0].Value = i;
                    this.dgvPermisos.Rows[i].Cells[1].Value = Enum.GetName(typeof(TipoAcceso), i);
                    this.dgvPermisos.Rows[i].Cells[2].Value = false;
                }
            }
            else
            {
                this.dgvPermisos.Rows.Add(1);
                this.dgvPermisos.Rows[0].Cells[0].Value = 0;
                this.dgvPermisos.Rows[0].Cells[1].Value = Enum.GetName(typeof(TipoAcceso), 0);
                this.dgvPermisos.Rows[0].Cells[2].Value = false;
            }
        }

        public void LoadPermisosOfFormulario(byte formularioID)
        {
            this.dgvPermisos.Rows.Clear();
            Formularios formulario = formularioCn.ObtenerFormularioPorID(formularioID);
            LoadOpcionOfFormulario(0);
            if (formulario.TieneOpcionInsertar) LoadOpcionOfFormulario(1);
            if (formulario.TieneOpcionModificar) LoadOpcionOfFormulario(2);
            if (formulario.TieneOpcionEliminar) LoadOpcionOfFormulario(3);
        }

        private void LoadOpcionOfFormulario(int i)
        {
            int j = dgvPermisos.Rows.Count;
            this.dgvPermisos.Rows.Add(1);
            this.dgvPermisos.Rows[j].Cells[0].Value = i;
            this.dgvPermisos.Rows[j].Cells[1].Value = Enum.GetName(typeof(TipoAcceso), i);
            this.dgvPermisos.Rows[j].Cells[2].Value = false;
        }
    }
}
